/**
 * com.sunrise.commons.dao.BaseDao.java
 */
package com.mbmed.doctor.commons.dao;

import java.util.List;

import org.apache.ibatis.session.RowBounds;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.jdbc.core.JdbcTemplate;

import com.mbmed.doctor.commons.utils.BaseVO;
import com.mbmed.doctor.commons.utils.Page;

 /**
 * @file  BaseDao.java
 * @author yangzhengxin(Jason)
 * @version 0.1
 * @todo DAO基本操作类
 * Copyright(C), 2013-2014
 *			Shenzhen Coordinates Software Development Co., Ltd
 * History
 *   	1. Date: 2013-4-18
 *      	Author: yangzhengxin(Jason)
 *      	Modification: this file was created
 *   	2. ...
 */
public abstract class BaseDao extends SqlSessionDaoSupport {
	
	/**
	 * 基础库连接
	 */
	protected JdbcTemplate jt;	
	
	/**
	 * Cache库连接
	 */
	protected JdbcTemplate cacheJt;
	
	/**
	 * @param jt the cacheJt to set
	 */
	public void setCacheJdbcTemplate(JdbcTemplate jt) {
		this.cacheJt = jt;
	}
	
	/**
	 * @param jt the jt to set
	 */
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jt = jdbcTemplate;
	}

	/**
	 * 功能：查询获取查询结果
	 * @param sqlDef	sql语句的定义名称
	 * @param param	查询所要用到的参数
	 * @return		List对象，里面是VO对象。
	 */
	@SuppressWarnings({ "rawtypes" })
	public  List queryForList(String sqlDef, Object param)throws Exception{
		return  getSqlSession().selectList(sqlDef,param);
	}
	
	/**
	 * 功能：查询获取查询结果的某一页的记录数据
	 * @param sqlDef	sql语句的定义名称
	 * @param param	查询所要用到的参数
	 * @param starNum	开始记录的位置
	 * @param num	获取的记录个数
	 * @return		List对象，里面是VO对象。
	 */
	@SuppressWarnings({ "rawtypes" })
	public  List queryForPageList(String  sqlDef,Object param,int starNum,int num)throws Exception{
		return  getSqlSession().selectList(sqlDef, param, new RowBounds(starNum,num));
	}
	
	/**
	 * 功能：查询获取查询结果的某一页对象
	 * @param sqlDef	获取查询结果sql语句的定义名称
	 * @param param	查询所要用到的参数
	 * @param currPage	当前页码
	 * @param pageSize	每页记录个数
	 * @return		Page对象
	 */	
	public  Page  queryForPage(String  sqlDef,Object param,int currPage,int pageSize)throws Exception{
		return  this.queryForPage(sqlDef,param,currPage,pageSize,sqlDef+"Count");
	}	
	
	/**
	 * 功能：查询获取查询结果的某一页对象
	 * @param sqlDef	获取查询结果sql语句的定义名称
	 * @param param	查询所要用到的参数
	 * @param currPage	当前页码
	 * @param pageSize	每页记录个数
	 * @param getCountSqlDef	获取记录总数sql语句的定义名称
	 * @return		Page对象
	 */	
	public Page  queryForPage(String  sqlDef,Object param,int currPage,int pageSize,String getCountSqlDef)throws Exception{
		if(getCountSqlDef==null){
			getCountSqlDef = sqlDef+"Count";
		}
		
		/*获取查询结果的记录总数*/
		int total = ((Integer)getSqlSession().selectOne(getCountSqlDef,param)).intValue();	
		int  pageIndex = currPage-1;
		pageIndex = pageIndex<0?0:pageIndex;
		currPage = currPage<1?1:currPage;
		/*开始记录的位置*/
		int  startNum = 0;
		startNum = pageIndex*(pageSize<1?1:pageSize);
		
		@SuppressWarnings("rawtypes")
		List  list = getSqlSession().selectList(sqlDef, param, new RowBounds(startNum,pageSize));		
		return new Page(list, pageSize,total,currPage);
	}
	
	/**
	 * 功能：查询获取查询结果,只有一条记录
	 * @param sqlDef	sql语句的定义名称
	 * @param param	查询所要用到的参数
	 * @return		BaseVO对象。
	 */	
	public  BaseVO  queryForObject(String  sqlDef,Object param)throws Exception{
		return  (BaseVO)getSqlSession().selectOne(sqlDef,param);
	}
	
	public  Object  queryForExtObject(String  sqlDef,Object param)throws Exception{
		return  getSqlSession().selectOne(sqlDef,param);
	}
	
	/**
	 * 功能：查询获取查询结果,只有一条记录
	 * @param sqlDef	sql语句的定义名称
	 * @param param	查询所要用到的参数
	 * @return		Object对象。
	 */	
	public  Object  queryToObject(String  sqlDef,Object param)throws Exception{
		return  (Object)getSqlSession().selectOne(sqlDef,param);
	}
	
	/**
	 * 功能：向数据库中插入一条数据记录
	 * @param sqlDef	sql语句的定义名称
	 * @param vo		VO对象
	 * @return	VO对象
	 */
	public  Object  insert(String  sqlDef,Object vo)throws Exception{
		getSqlSession().insert(sqlDef,vo);
		return  vo;
	}
	
	/**
	 * 功能：向数据库中更新一条数据记录
	 * @param sqlDef	sql语句的定义名称
	 * @param vo		VO对象
	 * @return	VO对象
	 */	
	public  Object  update(String  sqlDef,Object vo)throws Exception{
		getSqlSession().update(sqlDef,vo);
		return  vo;		
	}
	
	/**
	 * 功能：删除数据库中某些记录
	 * @param sqlDef	sql语句的定义名称
	 * @param param	sql语句所要用到的参数
	 * @return		删除记录个数
	 */
	public  int delete(String sqlDef,Object param)throws Exception{
		return  getSqlSession().delete(sqlDef,param);
	}
	
	/**
	 * 序列器
	 * @param seqName
	 * @return
	 */
	public long seqNextval(String seqName){
		String sql="SELECT "+seqName+".NEXTVAL FROM DUAL";
		return jt.queryForLong(sql);
	}
	
	/**
	 * 功能：用于count sql 
	 * @param sqlDef	sql语句的定义名称
	 * @param param sql语句所要用到的参数
	 * @return
	 */
	public long queryForLong(String sqlDef,Object param){
		return getSqlSession().selectOne(sqlDef, param);
	}
	
}
